/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package redinftel.formularios;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import redinftel.entidades.Amistad;
import redinftel.entidades.Usuario;

/**
 * Clase que devuelve el grado de separacion entre dos usuarios
 * mirando a que nivel pertenece y devuelve el numero del nivel
 * @author Six Degrees Team
 */
@ManagedBean
@SessionScoped
public class BuscarGradoSeparacionBean {

    private Usuario yo;
    private static final String USUARIO = "usuario";

    /**
     * constructor por defecto de buscar grados de separacion
     */
    public BuscarGradoSeparacionBean() {
        ChangeLocaleBean.cambiar();
    }

    public BuscarGradoSeparacionBean(boolean movil){
        
    }

    public Usuario getYo() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fctx.getExternalContext().getSession(false);
        yo = (Usuario) session.getAttribute(USUARIO);
        return yo;
    }

    public void setYo(Usuario yo) {
        this.yo = yo;
    }

    public int gradoSeparacion(Usuario amigo, Set<Usuario> listaAmigos) {
        Set<Usuario> visitados = new HashSet<Usuario>();
        visitados.add(amigo);

        if (amigo.equals(yo)) {// si soy yo, devuelvo 0
            return 0;
        }

        if (contiene(amigo, listaAmigos)) {// si está en el nivel 1, devuelvo 1
            return 1;
        } else { // si no, miro en el nivel 2
            Set<Usuario> listaAmigosU2 = new HashSet();
            Set<Usuario> listaAmigosU3 = new HashSet();
            Set<Usuario> listaAmigosU4 = new HashSet();
            Set<Usuario> listaAmigosU5 = new HashSet();
            Set<Usuario> listaAmigosU6 = new HashSet();
            for (Usuario u2 : listaAmigos) {
                if (!visitados.contains(u2)) {
                    // se crea la lista de amigos de u2
                    listaAmigosU2 = new HashSet();
                    for (Amistad a : u2.getAmistadCollection()) {
                        if (!a.getIdAmigo1().equals(u2)) {
                            listaAmigosU2.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u2)) {
                            listaAmigosU2.add(a.getIdAmigo2());
                        }
                    }
                    for (Amistad a : u2.getAmistadCollection1()) {
                        if (!a.getIdAmigo1().equals(u2)) {
                            listaAmigosU2.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u2)) {
                            listaAmigosU2.add(a.getIdAmigo2());
                        }
                    }
                    visitados.add(u2);
                    if (contiene(amigo, listaAmigosU2)) {// si está en el nivel 2, devuelvo 2
                        return 2;
                    }
                }
            }
            for (Usuario u3 : listaAmigosU2) {
                if (!visitados.contains(u3)) {
                    // se crea la lista de amigos de u
                    listaAmigosU3 = new HashSet();
                    for (Amistad a : u3.getAmistadCollection()) {
                        if (!a.getIdAmigo1().equals(u3)) {
                            listaAmigosU3.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u3)) {
                            listaAmigosU3.add(a.getIdAmigo2());
                        }
                    }
                    for (Amistad a : u3.getAmistadCollection1()) {
                        if (!a.getIdAmigo1().equals(u3)) {
                            listaAmigosU3.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u3)) {
                            listaAmigosU3.add(a.getIdAmigo2());
                        }
                    }
                    visitados.add(u3);
                    if (contiene(amigo, listaAmigosU3)) {// si está en el nivel 3, devuelvo 3
                        return 3;
                    }
                }
            }
            for (Usuario u4 : listaAmigosU3) {
                if (!visitados.contains(u4)) {
                    // se crea la lista de amigos de u
                    listaAmigosU4 = new HashSet();
                    for (Amistad a : u4.getAmistadCollection()) {
                        if (!a.getIdAmigo1().equals(u4)) {
                            listaAmigosU4.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u4)) {
                            listaAmigosU4.add(a.getIdAmigo2());
                        }
                    }
                    for (Amistad a : u4.getAmistadCollection1()) {
                        if (!a.getIdAmigo1().equals(u4)) {
                            listaAmigosU4.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u4)) {
                            listaAmigosU4.add(a.getIdAmigo2());
                        }
                    }
                    visitados.add(u4);
                    if (contiene(amigo, listaAmigosU4)) {// si está en el nivel 4, devuelvo 4
                        return 4;
                    }
                }
            }
            for (Usuario u5 : listaAmigosU4) {
                if (!visitados.contains(u5)) {
                    // se crea la lista de amigos de u
                    listaAmigosU5 = new HashSet();
                    for (Amistad a : u5.getAmistadCollection()) {
                        if (!a.getIdAmigo1().equals(u5)) {
                            listaAmigosU5.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u5)) {
                            listaAmigosU5.add(a.getIdAmigo2());
                        }
                    }
                    for (Amistad a : u5.getAmistadCollection1()) {
                        if (!a.getIdAmigo1().equals(u5)) {
                            listaAmigosU5.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u5)) {
                            listaAmigosU5.add(a.getIdAmigo2());
                        }
                    }
                    visitados.add(u5);
                    if (contiene(amigo, listaAmigosU5)) {// si está en el nivel 5, devuelvo 5
                        return 5;
                    }
                }
            }
            for (Usuario u6 : listaAmigosU5) {
                if (!visitados.contains(u6)) {
                    // se crea la lista de amigos de u
                    listaAmigosU6 = new HashSet();
                    for (Amistad a : u6.getAmistadCollection()) {
                        if (!a.getIdAmigo1().equals(u6)) {
                            listaAmigosU6.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u6)) {
                            listaAmigosU6.add(a.getIdAmigo2());
                        }
                    }
                    for (Amistad a : u6.getAmistadCollection1()) {
                        if (!a.getIdAmigo1().equals(u6)) {
                            listaAmigosU6.add(a.getIdAmigo1());
                        }
                        if (!a.getIdAmigo2().equals(u6)) {
                            listaAmigosU6.add(a.getIdAmigo2());
                        }
                    }
                    visitados.add(u6);
                    if (contiene(amigo, listaAmigosU6)) {// si está en el nivel 6, devuelvo 6
                        return 6;
                    }
                }
            }
            return 0;
        }
    }

    /**
     *
     * @param amigo
     * @param listaAmigos
     * @return devuelve bolean ,del usuario si pertenece a la lista de amigos
     */
    private boolean contiene(Usuario amigo, Set<Usuario> listaAmigos) {
        boolean contiene = false;
        Iterator iter = listaAmigos.iterator();
        while (!contiene && iter.hasNext()) {
            Usuario var = (Usuario) iter.next();
            contiene = amigo.equals(var);
        }
        return contiene;
    }
}
